iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 27
1

Layout

為了可以盡量還原DJ用的Mixer,所以用了很多SeekBar來控制所有音量和左右聲道的參數

原本兩個音量的SeelBar想做成垂直的,但試了很多方法,想放在右邊的SeekBar都會跑到中間或左邊,所以就先用水平的了

Method

MediaPlayer

MediaPlayer可以撥放音樂檔案

和在貓咪鋼琴用到的SoundPool不同,MediaPlayer一次只能載入一個檔案,但能撥放較長且較大的檔案,可以用在撥放BGM或是音樂撥放器

建立兩個MediaPlayer物件

lateinit  var ch1 : MediaPlayer
lateinit  var ch2 : MediaPlayer

onCreate()分別載入兩個不同的檔案

ch1 = MediaPlayer.create(this, R.raw.media1)
ch2 = MediaPlayer.create(this, R.raw.media2)

使用.start().pause()開始和暫停撥放

img_ch1.setOnClickListener {
    if(ch1.isPlaying){
        ch1.pause()
        img_ch1.setImageResource(android.R.drawable.ic_media_play)
    }else{
        ch1.start()
        img_ch1.setImageResource(android.R.drawable.ic_media_pause)
    }
}
img_ch2.setOnClickListener {
    if(ch2.isPlaying){
        ch2.pause()
        img_ch2.setImageResource(android.R.drawable.ic_media_play)
    }else{
        ch2.start()
        img_ch2.setImageResource(android.R.drawable.ic_media_pause)
    }
}

取得SeekBar的數值,使用.setVolume()設置左右聲道的聲音

fun setVol_ch1(){
    var m = vol_master.progress/100f*vol_ch1.progress/100f
    var l = (100-balance_ch1.progress)/100f*(100-balance_master.progress)/100f
    var r = balance_ch1.progress/100f*balance_master.progress/100f
    if(crossFader.progress > 100){
        m*= (200-crossFader.progress)/100f
    }

    ch1.setVolume(l*m,r*m)
}
fun setVol_ch2(){
    var m = vol_master.progress/100f*vol_ch2.progress/100f
    var l = (100-balance_ch2.progress)/100f*(100-balance_master.progress)/100f
    var r = balance_ch2.progress/100f*balance_master.progress/100f
    if(crossFader.progress < 100){
        m*= (crossFader.progress)/100f
    }

    ch2.setVolume(l*m,r*m)
}

對每個SeekBar使用OnSeekBarChangeListener(),在onProgressChanged()設置音量

vol_master.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
    override fun onProgressChanged(p0: SeekBar, p1: Int, p2: Boolean) {
        setVol_ch1()
        setVol_ch2()
    }
    override fun onStartTrackingTouch(seekBar: SeekBar) {}
    override fun onStopTrackingTouch(seekBar: SeekBar) {}
})

實作成果


上一篇
Day 26 影片撥放(VideoView)
下一篇
Day 28 TurnTable(MediaPlayer)
系列文
高中生Kotlin實作30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言